<?php namespace Home\Controller; 

use Hdphp\Controller\Controller;

//前台列表总控制器
class ListController extends Controller{
	
	private $cateModel;
	
	private $goodsModel;
	//构造函数
	public function __init(){
//			实例化分类表
		$this->cateModel = new \Common\Model\cate;
//			实例化商品表
		$this->goodsModel = new \Common\Model\goods;
	}
	
//前台列表页面
    public function index(){
		
//		p(Q('get.'));
			
////	获的分类的id		
	$cid = Q('get.cid',0,'intval');
////	获得分类表里面的全部数据
//	$newModel = $this->cateModel->get();
////	找到它下面的所有子集
//	$cids = $this->cateModel->recSon($newModel,$cid);
////	他他自己的id压到数组里  这样就会就是获得的所有数据了     传进来的id和他的子集
//	$cids[]= $cid;
////	循环找到那个商品
//	foreach ($cids as $v) {
////			获得商品
//		$goodsModel = $this->goodsModel->where("cate_cid={$v}")->get();
//				
//	}
////			分配数据
//	View::with('goodsModel',$goodsModel);
			
	//		找到分类表里面的传进来的数据name值
		$cname = $this->cateModel->where("cid={$cid}")->pluck('cname');		
	//			p($cname);
		View::with('cname',$cname);
				
	//		找到商品表里面的cate_cid等于传进来的id的那个数个数据
		$bnameModel = $this->goodsModel->where("cate_cid={$cid}")->find();

	//		把那个数据里面的  和品牌表关联的那个字段值拿出来  赋到变量里
		$bid = $bnameModel['brand_bid'];
//		p($bid); 
//		实例化品牌表
		if($bid!=0){
			
		$brandModel = new \Common\Model\Brand;
//			再在品牌表里面找到上面  获得的id的那个数据的  name值
		$name = $brandModel->where("bid={$bid}")->find();
		}else{
			$bid = 1;
			$brandModel = new \Common\Model\Brand;
//			再在品牌表里面找到上面  获得的id的那个数据的  name值
			$name = $brandModel->where("bid={$bid}")->find();
		}
//			p($name);
	//		分配变量
		View::with('name',$name);
			
//			p($cid);
//1.根据当前的cid获得对应的商品的gid
//		执行gidAttr方法并把 子集和父级的cid传过去      
		$gids = $this->gidAttr($cid);
//		p($gids);	
		if($gids != null){
//		    根据获得的gid 找到商品属性       把获得gid传过去         
//				  调用方法 下面的 goodsDity  会获得类型属性表和商品属性表组合在一起的数组
//2.根据gid找到商品属性
			$temp = $this->goodsDity($gids);		
	//		p($temp);	  //分配变量
			View::with('temp',$temp);		
	//3.处理筛选参数param 0_0_.....				
	//		处理	筛选参数	       获得参数的个数  也就是上面的数组的数量
			$num = count($temp);
	//		p($num);  判断地址栏有没有这个外部变量$_GET['param']   有就把他拆开 以_分开    不是 就用0代替   出来$num个   也就是上面上面的分组个数 
			$param = isset($_GET['param']) ? explode('_', $_GET['param']) : array_fill(0, $num, 0);
			View::with('param',$param);
	//		p($param);
	//			调用下面的filter方法     把筛选传过来的id 和商品全部id(子集和父级)传过去
	//4.通过param参数筛选商品gid
			$fiterModel = $this->filter($param,$gids);	
	//				p($fiterModel);
			
			
//			判断筛选的商品        传过来的$fiterModel里面有没有商品
			if($fiterModel != null){
//5.调取数据	
	//			获得筛选出来的id  把他组成字符串        再找到那些数据
			$goodsModel = $this->goodsModel->where("gid in(".implode(',', $fiterModel) .")")->get();
					
			View::with('goodsModel',$goodsModel);	
			View::make();	
			}else{
				View::success('没有满足这个条件的这个商品',U('List/index'));		
		}
		}else{
			View::success('您选的分类下面没有商品',U('List/index'));		
		}		
	}		

			
	private function filter($param,$oldgid){
//	p($oldgid);
//		实例化类型属性表
		$dityModel = new \Common\Model\Dity;
//		定义一个空数组
		$gidss = array();
//		循环上面的$param数组 
		foreach ($param as $gaid) {
//			判断他里面的值有没有
			if($gaid){
//						找到分类属性表对应循环出来的$gaid全部数据     只要dattr字段  也就是 什么颜色(红色)
				$oldDity = $dityModel->where("did={$gaid}")->pluck('dattr');
//						然后再根据上面找到的颜色在找到那个商品的id    把他存进数组里面
				$gidss[] = $dityModel->where("dattr='{$oldDity}'")->lists('goods_gid');
			}
		}
//		p($gidss);  
//如果点击了“不限”之外的属性
		//判断$gidss是不是空的
			if($gidss){
//	取交集					$gidss是2维数组   $gidss[0]就是把里面的所有的数据    拿出来赋到$gidTemp这个新变量里
				$gidTemp = $gidss[0];
//						循环传过来的$gidss这个数组  
				foreach ($gidss as $v) {
//						找出新变量里的值和上面传过来的数组里的值对比  找出相同的那个值  再赋给$gidTemp变量
					$gidTemp = array_intersect($gidTemp, $v);
				}
//				和当前分类对应的gid再次取交集     $oldgid 是他的本身的id 和他下面所有子集的id   也就是递归获得的id
				return array_intersect($gidTemp,$oldgid);
			}else{//如果是全部是“不限”的时候
				return $oldgid;
			}
//		p($gidTemp);
		
	}






	
	private function goodsDity($gids){
//		实例化商品属性表
		$dityModel = new \Common\Model\Dity;
//			根据获得的传过来的商品id  找到商品属性表里面的那条数据
		$dithAttr = $dityModel->where("goods_gid in(".implode(',', $gids) .")")->get();
//		p($dithAttr);
//			定义一个空数组
			$oldDity  = array();
		foreach ($dithAttr as $v) {
//			p($v);   把循环出来的数据   根据$v里面的attr_thid分类   把attr_thid一样的存到一个数组里    然后再把它存到定义好的那个空数组里
			$oldDity[$v['attr_thid']][] = $v;
		}
		
		
		
//		定义一个空数组
		$temp = array();
//		实例化类型属性表
		$attrModel = new \Common\Model\Attr;
//			循环上面获得的商品属性 数据
		foreach ($oldDity as $k => $v) {
//				p($v);
//				把获得的数据存进空数组里
			$temp[] = array(
//				 根据从上面的 数组   	找到类型属性表里面的thname字段的值   把他赋给name
				'name'=>$attrModel->where("thid={$k}")->pluck('thname'),
//					找到类型属性表里面的所有数据   把他赋给value
				'value'=>$v,
			);
		}
//		p($temp);
		return $temp;
		
	}
	
	
	
	
	
	
	
	
	
	
	

//	通过cid获得商品表里面的商品
	private function gidAttr($cid){
//		实例化 商品属性表
		$dityModel = new \Common\Model\Cate;
//		调用下面的gidSon方法     把商品属性里面的全部数据  和获得的cid传过去     运行完下面的方法后再把他存到变量里   下面会传过来他的所有子集的id
		$cids = $this->gidSon($dityModel->get(),$cid);
//		把他自己也存进去   也就是传过来的cid   获得的所有的cid   子集和父级
		$cids[] = $cid;
//	p($cids);         implode(',', $cids) .")把$cids这个数组 的值合成字符串  以,隔开
//			然后找到数据库里面的cate_cid的值 有$cids里面的数字   把获得的数据存进变量里
				//也就是通过子集cid查找对应的商品的gid
		$gids = $this->goodsModel->where("cate_cid in(" .implode(',', $cids) .")")->lists('gid');
//	p($gids);
//		return出去  让上面调用他的 可以接到
		return $gids;   
	}

	private function gidSon($data,$cid){
//				定义一个空数组
			$temp = array();
//				循环全部数据
			foreach ($data as $v) {
//				找到全部数据里面pid等于传过来的cid的那个数据  
				if($v['pid'] == $cid){
//					把他存到空数组里
					$temp[] = $v['cid'];
//					把temp这个数组和   再次调用这个方法  并把全部数据和$v['cid']递归试调用  一直到他下面没子集了   运行一次把值存进去一次
					$temp = array_merge($temp,$this->gidSon($data,$v['cid']));
				}
			}
//			p($temp);
			return $temp;
		}

	
			
			
}			
			
?>			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
    	